package com.penghaisoft.microwms.base.web.auth.controller;

import com.alibaba.fastjson.JSON;
import com.penghaisoft.microwms.base.web.auth.service.IBaseDataAuthService;
import com.penghaisoft.microwms.base.web.auth.service.IBaseUserDataauthTypeService;
import com.penghaisoft.microwms.base.web.auth.service.IUserService;
import com.penghaisoft.microwms.common.Constant;
import com.penghaisoft.microwms.common.base.model.BaseUser;
import com.penghaisoft.microwms.common.base.model.BaseUserDataAuth;
import com.penghaisoft.microwms.common.base.model.BaseUserDataauthType;
import com.penghaisoft.microwms.common.controller.BaseController;
import com.penghaisoft.microwms.common.dto.*;
import com.penghaisoft.microwms.common.page.Pager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author zhangxu
 * 数据权限rest接口
 */
@Slf4j
@RestController
@RequestMapping(value="/auth/data")
public class BaseDataauthController extends BaseController {

	@Autowired
	private IBaseDataAuthService baseDataAuthService;
	
	@Autowired
    private IBaseUserDataauthTypeService baseUserDataauthTypeService;

	@Autowired
	private IUserService userService;

	/**
	 * @Fields redisTemplate : resource
	 */
	@Autowired
	private StringRedisTemplate redisTemplate;


	/** 
	 * @Title: queryReportUserAuth 
	 * @Description: 查询报表用户的权限
	 * @author zhangxu 
	 * @2017年4月7日:2017年4月7日:下午1:29:28
	 * @param @param userId
	 * @param @return    
	 * @return TransResult    
	 * @throws 
	 */
	@PostMapping("{loginName}/report/ftypes")
	public TransResult queryReportUserAuth(@PathVariable("loginName")String loginName){
		BaseUser userInfo = new BaseUser();
		userInfo.setLoginName(loginName);
		List<String> ftypes = baseDataAuthService.queryReportUserFactoryTypes(userInfo);
		return success(ftypes);
	}
	
	/** 
	* @Title: addReportUserFactoryType 
	* @Description: 更新报表用户的工厂类型
	* @author zhangxu 
	* @2017年4月7日:2017年4月7日:下午2:26:19
	* @param @param dataAuths
	* @param @return    
	* @return TransResult    
	* @throws 
	*/
	@PostMapping(value="/report/u")
	public TransResult updReportUserFactoryType(@RequestBody List<BaseUserDataAuth> dataAuths) {
		Resp resp = baseDataAuthService.saveReportUserDataAuths(dataAuths);
		if (resp.getCode().equals(Constant.SUCCESS)) {
			updUserDataAuthCache(dataAuths);
		}
		return fromResp(resp);
	}
	
	
	/** 
	* @Title: queryBuzUserAuths 
	* @Description: 查询业务用户的各种权限
	* @author zhangxu 
	* @2017年4月26日:2017年4月26日:上午10:39:40
	* @param @param loginName
	* @param @return    
	* @return TransResult    
	* @throws 
	*/
	@PostMapping("{loginName}/buz/types")
	public TransResult queryBuzUserAuths(@PathVariable("loginName")String loginName){
		String factoryCode = getCurrentFactoryCode();
		List<BuzUserDataAuthDto> dtos = new ArrayList<>();
//		数据权限的类型
		List<BaseUserDataauthType> types = baseUserDataauthTypeService.queryAll();
		BaseUserDataAuth param = new BaseUserDataAuth();
		param.setLoginName(loginName);
		param.setFactoryCode(factoryCode);
//		用户拥有的所有权限
		List<BaseUserDataAuth> buzUserAuths = baseDataAuthService.queryBuzUserDataAuths(param);
//		根据权限的类型收集数据
		for (int i = 0; i < types.size(); i++) {
			BaseUserDataauthType t = types.get(i);
			t.setUserDefined1(factoryCode);
			BuzUserDataAuthDto dto = new BuzUserDataAuthDto();
			dto.setTabCode(t.getNormalUserBuzType());
			dto.setTabName(t.getNormalUserBuzTypeName());
//			每个权限类别的所有
			List<KeyValueObj> tabAllList = baseUserDataauthTypeService.getTabAllList(t);
			dto.setTabAllList(tabAllList);
//			用户的在每个类别拥有的权限
			List<KeyValueObj> tabSelectList = getTabSelectList(t,buzUserAuths);
			dto.setTabSelectList(tabSelectList);
			dtos.add(dto);
		}
		return success(dtos);
	}
	
	/** 
	* @Title: getTabSelectList 
	* @Description: 构型转换
	* @author zhangxu 
	* @2017年4月26日:2017年4月26日:上午11:12:48
	* @param @param buzUserAuths
	* @param @return    
	* @return List<KeyValueObj>    
	* @throws 
	*/
	private List<KeyValueObj> getTabSelectList(BaseUserDataauthType type,List<BaseUserDataAuth> buzUserAuths) {
		List<KeyValueObj> tabSelectList = new ArrayList<>();
		for (int i = 0; i < buzUserAuths.size(); i++) {
			BaseUserDataAuth auth = buzUserAuths.get(i);
			KeyValueObj obj = new KeyValueObj();
			if (type.getNormalUserBuzType().equals(auth.getNormalUserBuzType())) {
				obj.setKey(auth.getBuzCode());
				obj.setValue(auth.getBuzCode());
				tabSelectList.add(obj);
			}
		}
		return tabSelectList;
	}
	
	/** 
	* @Title: updBuzUserDataAuth 
	* @Description: 更新业务用户的各种数据权限
	* @author zhangxu 
	* @2017年4月26日:2017年4月26日:上午10:42:43
	* @param @param loginName
	* @param @param dtos
	* @param @return    
	* @return TransResult    
	* @throws 
	*/
	@PostMapping(value="/buz/u/{loginName}")
	public TransResult updBuzUserDataAuths(@PathVariable("loginName")String loginName, @RequestBody List<BuzUserDataAuthDto> dtos) {
		List<BaseUserDataAuth> auths = new ArrayList<>();
		for (int i = 0; i < dtos.size(); i++) {
			BuzUserDataAuthDto dto = dtos.get(i);
			String type = dto.getTabCode();
			List<KeyValueObj> selectList = dto.getTabSelectList();
			for (int j = 0; j < selectList.size(); j++) {
				BaseUserDataAuth auth = new BaseUserDataAuth();
				auth.setLoginName(loginName);
				auth.setNormalUserBuzType(type);
				auth.setFactoryCode(getCurrentFactoryCode());
				auth.setBuzCode(selectList.get(j).getKey());
				auths.add(auth);
			}
		}
		Resp resp = baseDataAuthService.saveBuzUserDataAuths(auths);
		if (resp.getCode().equals(Constant.SUCCESS)) {
//			更新缓存中的用户数据权限
			updUserDataAuthCache(auths);
		}
		return fromResp(resp);
	}
	
	
	/** 
	* @Title: updUserDataAuthCache 
	* @Description: 更新缓存中的用户数据权限
	* @author zhangxu 
	* @2017年4月26日:2017年4月26日:上午11:00:12
	* @param @param dataAuths    
	* @return void    
	* @throws 
	*/
	private void updUserDataAuthCache(List<BaseUserDataAuth> dataAuths) {
		if(dataAuths!=null&&dataAuths.size()>0){
			log.info("更改用户数据权限时同步刷新redis dataAuth:"+dataAuths.get(0).getLoginName());
			String userLoginName = dataAuths.get(0).getLoginName();
			redisTemplate.opsForValue().set(Constant.DATA_AUTH_PREFIX+userLoginName, JSON.toJSONString(dataAuths));
		}
	}
	
	/**
	 * @Description: 查询分页列表
	 * @param @param page
	 * @param @param rows
	 * @param @param baseUserDataauthType
	 * @param @return   
	 * @return TransResult  
	 * @author sun_yq
	 * @date 2017年9月11日 下午2:21:18
	 */
	@PostMapping("list")
    public TransResult list(@RequestParam(name = "page", defaultValue = "1") int page,
                            @RequestParam(name = "rows", defaultValue = "10") int rows, BaseUserDataAuthForm baseUserDataAuthForm) {
        Pager<BaseUserDataAuthForm> result = baseDataAuthService.findListByCondition(page,rows,baseUserDataAuthForm);
        return success(result);
    }

}
